package J4_9;

import java.util.*;

public class test {
    //给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。
    //
    //注意：不要求字典中出现的单词全部都使用，并且字典中的单词可以重复使用。
    public boolean wordBreak(String s, List<String> wordDict) {
        Set<String> map = new HashSet<>(wordDict);
        int n = s.length();
        boolean[] dp = new boolean[n+1];
        dp[0] = true;
        for (int i = 1; i <= n; i++) {
            for (int j = i-1; j >= 0 ; j--) {
                if (dp[j] && map.contains(s.substring(j,i))) {
                    dp[i] = true;
                    break;
                }
            }
        }
        return dp[n];
    }

    //定义字符串 base 为一个 "abcdefghijklmnopqrstuvwxyz" 无限环绕的字符串，所以 base 看起来是这样的：
    //
    //"...zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd....".
    //给你一个字符串 s ，请你统计并返回 s 中有多少 不同非空子串 也在 base 中出现。
    public int findSubstringInWraproundString(String s) {
        HashMap<Character,Integer> map = new HashMap<>();
        int[] dp = new int[s.length()];
        dp[0] = 1;
        int ret = 0;
        for (int i = 1;i < s.length(); i++) {
            char cur = s.charAt(i);
            char prev = s.charAt(i-1);
            if ((cur - prev + 26) %26 == 1) {
                dp[i] = dp[i-1] + 1;
            } else {
                dp[i] = 1;
            }
        }
        for (int i = 0 ;i < s.length();i++) {
            map.put(s.charAt(i),Math.max(map.getOrDefault(s.charAt(i),1),dp[i]));
        }
        for (Map.Entry<Character,Integer> entry: map.entrySet()) {
            ret += entry.getValue();
        }
        return ret;

    }


    //给定一个未排序的整数数组 nums ， 返回最长递增子序列的个数 。
    //
    //注意 这个数列必须是 严格 递增的。
    public static int findNumberOfLIS(int[] nums) {
        int n = nums.length;
        int[] dp = new int[n];
        int[] count = new int[n];
        for (int i = 0; i < n; i++) {
            dp[i] = count[i] = 1;
        }

        for (int i = 1; i < n; i++) {
            int maxLen = 0;
            for (int j = 0; j < i; j++) {
                if (nums[j] < nums[i]) {
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                    if (dp[i] == maxLen) {
                        count[i]+=count[j];
                    } else if (dp[j] + 1 > maxLen){
                        count[i] = count[j];
                        maxLen = dp[i];
                    }
                }
            }
        }
        int max = 0;
        for (int i = 0; i < n; i++) {
            max = Math.max(max, dp[i]);
        }
        int count1 = 0;
        for (int i = 0; i < n; i++) {
            if (dp[i] == max) count1 += count[i];
        }
        return count1;

    }

    public static void main(String[] args) {
        int[] arr = new int[]{1,2,4,3,5,4,7,2};
        findNumberOfLIS(arr);
    }
}
